package com.computergames.server.protocol;
import com.computergames.server.message.chessMessage.AbstractChessMessage;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.computergames.server.message.chessMessage.GobangMessage;

import java.io.IOException;
/*
在Java中，特别是涉及到JSON处理库如Gson时，read 和 write 方法是TypeAdapter接口的一部分，用于自定义对象的序列化和反序列化过程。
read方法:
作用: 该方法用于从输入源（如JsonReader）读取JSON数据并将其转换为指定类型（本例中是AbstractChessMessage）的对象实例。这是反序列化过程。
参数:
JsonReader: 一个用于读取JSON元素（如对象、数组、字符串等）的流式API。
返回值: 反序列化后的对象实例，即AbstractChessMessage类型的对象。
异常: 可能会抛出IOException，如果在读取过程中发生I/O错误。
write方法:
作用: 该方法将一个对象实例（这里是AbstractChessMessage）转换为JSON格式，并写入到输出目标（如JsonWriter）。这是序列化过程。
参数:
JsonWriter: 一个用于写出JSON元素的流式API。
abstractChessMessage: 要被序列化的对象实例。
异常: 可能会抛出IOException，如果在写入过程中发生I/O错误。
这两个方法共同实现了对象与JSON字符串之间的双向转换，是实现自定义数据绑定逻辑的关键部分。在上面的示例代码中，write和read方法都还没有具体的实现逻辑，需要根据实际需求填充相应的序列化和反序列化逻辑。
 */
public class AbstractChessMessageTypeAdapter extends TypeAdapter<AbstractChessMessage>{
    private final Gson gson;

    public AbstractChessMessageTypeAdapter(Gson gson) {
        this.gson = gson;
    }

    @Override
    public void write(JsonWriter out, AbstractChessMessage message) throws IOException {
        if (message == null) {
            out.nullValue();
            return;
        }

        out.beginObject();
        // 写入所有公共属性，假设它们是公开的
        out.name("chess").value(message.getChess());
        out.name("coordinate").beginArray();
        for (String coord : message.getCoordinate()) {
            out.value(coord);
        }
        out.endArray();

        // 如果有更多公共属性，继续添加

        // 特定子类的处理，可以通过反射或类型判断来实现更灵活的序列化
        if (message instanceof GobangMessage) {
            // 假设GobangMessage有额外的字段需要序列化
            // 注意：这里仅为示例，实际中根据具体子类属性调整
            GobangMessage gobangMsg = (GobangMessage) message;
            // 序列化GobangMessage特有属性
        }
        // 类似地，处理其他子类

        out.endObject();
    }

    @Override
    public AbstractChessMessage read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }

        in.beginObject();

        // 需要先读取到messageType，但按您的逻辑应该在读取到它之前结束对象，这里修正逻辑
        int messageType = -1;
        while (in.hasNext()) {
            String name = in.nextName();
            if ("messageType".equals(name)) {
                messageType = in.nextInt();
                break;
            } else {
                // 跳过未知属性直到找到messageType，或直接结束当前对象
                in.skipValue();
            }
        }
        in.endObject(); // 结束读取外层对象

        // 根据messageType实例化对应的子类
        AbstractChessMessage message = null;
        switch (messageType) {
            case 14: // 假设"14"对应于GobangMessage类型
                // 重新开始读取json，因为我们结束了之前的对象
                in.beginObject();
                message = gson.fromJson(in, GobangMessage.class);
                in.endObject(); // 结束内部对象的读取
                break;
            // 其他case分支处理其他子类
            case -1:
                break;
            default:
                throw new UnsupportedOperationException("Unsupported messageType: " + messageType);
        }
        return message;
    }
}
